查看原文
其他

Python爬虫 | 爬取虎牙直播星秀区1000多位漂亮小姐姐照片并做颜值评分

才哥 可以叫我才哥 2021-10-08




大家好,今天我们看看虎牙直播都有哪些好看的小姐姐吧!

我们打开虎牙直播选择娱乐天地的星秀模块,然后抓取下载正在直播的全部主播房间封面图,再用face++的颜值评分api看看好看的小姐姐都有哪些~

1.页面分析

打开虎牙直播星秀模块,按F12进入开发者模式,然后选中Network->XHR,再拖到页面最下方点击第2页,查看开发者页签中Name的变化找到如图所示部分即可。

页面分析

虎牙直播这个翻页比较简单,直接通过原始url地址加上请求参数即可,如下:

# 原始url地址
url = 'https://www.huya.com/cache.php'
# 请求参数
parames = {
    'm''LiveList',
    'do''getLiveListByPage',
    'gameId'1663,
    'tagAll'0,
    'page'2# 翻页后会变化的字段
    }

我们点击开发者模式页签里的Preview可以看到请求的结果也是很格式化的,如下:

请求的结果预览

再对照左侧的实际网页渲染的结果,我们可以看到包含封面图(对应请求结果的screenshot),房间的简介(对应请求结果的 introduction),主播名称(对应请求结果的nick)以及其他一些更详细的信息。

某主播房间封面信息

2.单页主播信息爬取

对于请求的数据是非常标准的格式,我们直接用**json.loads()**方法即可解析为字典格式,然后选取需要的键值信息即可。

通过分析请求的结果数据,我们发现需要的单页主播信息在data = js['data']['datas']中,是由字典组成的列表。同时,我们也可以发现此时在进行直播的主播数为1102,总页数为totalPage,这为我们后续做自动翻页提供了便利。

结果格式
import requests
import json
import pandas as pd

headers = {
    "User-Agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
    }
# 原始Url地址
url = 'https://www.huya.com/cache.php'
# 请求参数
parames = {
    'm''LiveList',
    'do''getLiveListByPage',
    'gameId'1663,
    'tagAll'0,
    'page'1,
    }

rep = requests.post(url,headers=headers,params=parames)
text = rep.text
# 请求结果为json格式,我们用json.loads()方法处理
js = json.loads(text)
# 通过字典获取键值
data = js['data']['datas']
# 直接转化为dataframe类型
df = pd.DataFrame(data)

转化为dataframe后结果预览,非常标准,如下:

dataframe结果预览

3.主播图片下载

我们获取了主播房间的封面图(对应请求结果的screenshoturl地址,直接请求改地址然后就可进行保存本地了。

这里可以先将df中的该列数据转化为列表,然后遍历列表进行请求和下载到本地。

# 主播图片地址列表
urls = df.screenshot.to_list()
# 主播名称列表
nicks = df.nick.to_list()
for i,(nick,imgUrl) in enumerate(zip(nicks,urls)):
    img = requests.get(imgUrl).content
    name = f'封面图\{nick}.jpg'
    with open(name,'wb'as f:
        f.write(img)
        
    print(f'{i+1}个图片已下载')

下载完成的主播封面图:

主播封面图

4.主播颜值评分

颜值评分这块我这里调用的是FACE++的人脸识别功能,使用前需要注册账号,然后申请一个应用即可。

face++

创建应用获取你的key你的secret,替换代码中相关部分。

你的应用
# 定义获取评分的函数
def ksfaceScore(pic_url):
    '''
    Parameters
    ----------
    pic_url : str
        用于进行颜值评分的图片地址
    Returns
    -------
    gender:str
        性别
    age:int
        年龄
    beauty_w:int
        女性视角评分
    beauty_m:int
        男性视角评分
    '''

    url = 'https://api-cn.faceplusplus.com/facepp/v3/detect'
    
    APIKey = '你的key' 
    APISecret = '你的secret'
#    pic_url = 'https://anchorpost.msstatic.com/cdnimage/anchorpost/1071/be/43a2756f5fc3aa0df31a1bc14fb13a_1663_1610179385.jpg'
    
    data = {"api_key":APIKey,
            "api_secret":APISecret,
            "image_url":pic_url,
            "return_attributes":"gender,age,beauty"
            }
    res = requests.post(url,data = data)
    dic_ = eval(res.text)
    gender = dic_['faces'][0]['attributes']['gender']['value']
    age = dic_['faces'][0]['attributes']['age']['value']
    beauty_w = dic_['faces'][0]['attributes']['beauty']['female_score']
    beauty_m = dic_['faces'][0]['attributes']['beauty']['male_score']
    
    return gender,age,beauty_w,beauty_m

拿下面这个小姐姐图片做示例,其照片url地址为 https://anchorpost.msstatic.com/cdnimage/anchorpost/1071/be/43a2756f5fc3aa0df31a1bc14fb13a_1663_1610179385.jpg

【Miu】木木

我们调用函数获取相关参数数值如下:

In [1]: pic_url = 'https://anchorpost.msstatic.com/cdnimage/anchorpost/1071/be/43a2756f5fc3aa0df31a1bc14fb13a_1663_1610179385.jpg'

In [2]: ksfaceScore(pic_url)
Out[2]: ('Female'2286.1885.295)

性别:Female(女)
年龄:22
女性视角评分:86.18
男性视角评分:85.295

5.完整代码(全部爬取、下载及评分)

以上部分建议大家在进行实操之后可进行功能模块的函数化,定义每个功能的实现函数,这样就比较优雅,我这里附上不太优雅的全部代码啦。

看下颜值最高的:

性别:Female(女)
年龄:22
女性视角评分:93.498
男性视角评分:92.441

本期颜值评分最高
整代码如下:
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 14 12:47:38 2021
@author: 可以叫我才哥
"""


import requests
import json
import pandas as pd
import time

url = 
'https://www.huya.com/cache.php'
headers = {
    
"User-Agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
    }
dfs = []
# 这里的page总数你可以自动获取其实~
for page in range(1,16):
    parames = {
        
'm''LiveList',
        
'do''getLiveListByPage',
        
'gameId'1663,
        
'tagAll'0,
        
'page'page,
        }
    
    rep = requests.post(url,headers=headers,params=parames)
    
    text = rep.text
    js = json.loads(text)
    data = js[
'data']['datas']
    
    df = pd.DataFrame(data)
    dfs.append(df)

result = pd.concat(dfs)

# 下载照片到本地
urls = result.screenshot.to_list()
nicks = result.nick.to_list()
for i,(nick,imgUrl) in enumerate(zip(nicks,urls)):
    img = requests.get(imgUrl).content
    name = 
f'封面图\{nick}.jpg'
    
with open(name,'wb'as f:
        f.write(img)
        
    print(
f'{i+1}个图片已下载')

# 颜值评分函数
def ksfaceScore(pic_url):
    
'''
    Parameters
    ----------
    pic_url : str
        用于进行颜值评分的图片地址
    Returns
    -------
    gender:str
        性别
    age:int
        年龄
    beauty_w:int
        女性视角评分
    beauty_m:int
        男性视角评分
    '''

    url = 
'https://api-cn.faceplusplus.com/facepp/v3/detect'
    
    APIKey = 
'你的key' 
    APISecret = 
'你的secret'
#    pic_url = 'http://img5.iqiyipic.com/image/paopao/paopao_5e71ef4a4e5042268db59ac4_default.jpg?' 
    data = {
"api_key":APIKey,
            
"api_secret":APISecret,
            
"image_url":pic_url,
            
"return_attributes":"gender,age,beauty"
            }
    res = requests.post(url,data = data)
    dic_ = eval(res.text)
    
try:
        gender = dic_[
'faces'][0]['attributes']['gender']['value']
        age = dic_[
'faces'][0]['attributes']['age']['value']
        beauty_w = dic_[
'faces'][0]['attributes']['beauty']['female_score']
        beauty_m = dic_[
'faces'][0]['attributes']['beauty']['male_score']
    
except :
        gender = age = beauty_w = beauty_m = 
-1
    
    
return gender,age,beauty_w,beauty_m

# 整合颜值评分
lis = []
for i,pic_url in enumerate(urls):
    time.sleep(
0.5)
    gender,age,beauty_w,beauty_m = ksfaceScore(pic_url)
    lis.append([gender,age,beauty_w,beauty_m])
    print(
f'{i+1}个颜值已处理')

score = pd.DataFrame(lis,columns=[
'性别','年龄','女性视角评分','男性视角评分'])
   
# 中文变量名 
结果 = df.merge(score,left_index=
True,right_index=True)
- END -

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存